<?php
/**
 * @APP@
 *
 * PHP versions 5
 *
 * @category   BEAR
 * @package    App
 * @subpackage App_Page
 * @author     $Author: anonymous $ <anonymous@example.com>
 * @version    SVN: Release: $Id:$
 */

/**
 * アプリケーションページ
 *
 * @category   BEAR
 * @package    App
 * @subpackage App_Page
 * @author     $Author: anonymous $ <anonymous@example.com>
 * @copyright  anonymous All rights reserved.
 * @version    SVN: Release: $Id:$
 */
abstract class App_Page extends BEAR_Page implements Zend_Acl_Resource_Interface
{
    /**
     * ロール
     *
     * @var string
     */
    protected $_role = 'guest';

    /**
     * ページのユーザーID
     *
     * @var string
     */
    protected $_user_id = null;

    /**
     *  セッション
     *
     * @var BEAR_Session
     */
    protected $_session;

    /**
     * リソースアクセスクラス
     *
     * @var BEAR_Resource
     */
    protected $_resource;

    /**
     * ログイン情報
     *
     * @var array
     */
    protected $_auth;

    /**
     * コンストラクタ
     */
    function __construct(array $config)
    {
        parent::__construct($config);
    }

    /**
     * インジェクト
     *
     * ページをリソースモードで実行するときにはACLを用いません。
     *
     * @return void
     */
    public function onInject()
    {
        parent::onInject();
        $this->_session = BEAR::dependency('BEAR_Session');
        $this->_resource = BEAR::dependency('BEAR_Resource');
        $this->_log = BEAR::dependency('BEAR_Log');
        //　ページアクセスコントロール
        $this->_injectAcl();
        // ログイン？
        if (is_array($this->_auth) && $this->_auth) {
            $this->injectArg('auth', $this->_auth);
        }
    }

    /**
     * Auth & ACL
     *
     * ユーザー認証と、認証結果によるページのアクセスコントロールを行います。
     *
     * @return void
     */
    protected function _injectAcl()
    {
        // Auth & ACL
        $this->_appAuth = BEAR::dependency('App_Auth');
        $this->_auth = $this->_appAuth->get();
        $this->set('auth', $this->_auth);
        $this->_appAuth->setUserId($this->_user_id);
        $this->_role = $this->_appAuth->getRoleId();
        $this->_acl =  BEAR::dependency('App_Acl', array(), array('persistent'=>true));
        $isAllowed = $this->_acl->allow($this->_role, $this->_config['resource_id'], 'read');
        if (!$isAllowed) {
            throw $this->_exception('App_Acl_Exception', array('code'  => 400));
            //            throw new Panda_Exception('Access Not Allowed', 400, array('role'=>$this->_role, 'resource_id'=>$this->_config['resource_id']));
        }
        $this->set('role', $this->_role);
    }

    /**
     * リソースIDの取得
     *
     * Zend_Acl_Resource_Interfaceの実装。
     * ページクラス名をリソースIDとして扱っています。
     *
     * @return string
     */
    public function getResourceId()
    {
        return $this->_config['resource_id'];
    }

    /**
     * Output
     *
     * @return void
     */
    public function onOutput()
    {
        $this->display();
    }

    /**
     * ページ内例外
     *
     * @param Exception　$e　例外
     *
     */
    public function onException(Exception $e){
        p(get_class($e));
        exit();
        throw $e;
    }
}